h1 {
  font-family: courier;
  font-size: 20pt;
  color: white;
  border-bottom: 3px solid white
}

h2 {
  color: #FCED3B
}

h3 {
  font-family: verdana;
  font-size: 15pt;
  color: white;
}

h4 {
  padding-top: 10px;
  font-family: sans-serif;
  font-weight: bold;
  color: black
}

p {
  font-family: arial, verdana, sans-serif;
  font-size: 12pt;
  font-weight: bold;
  padding:10px;
  color: #ffffff;
}

body {
  background-color: #FC12D6
}

Project requirements

I created a repository and met the syntax requirements which were using two different levels of headers, ordered and un-ordered bullet points, use of bold font weight and italics and formatting links with “”. This prepared me for my Cascading Style Sheets programming, which was my favorite part of this project and I am really excited to try out more funky formats in future since the learning will prepare me for formal and professional reports.

Link to my website: https://github.com/Muthu-3A/stats220

Link to my repository: https://github.com/Muthu-3A/stats220/blob/main/README.md

Below is a photograph of my project folder. Project based file management is natural to me and I have already been using it.

screenshot_path <- "C:/Users/muthu/OneDrive/Documents/stats 220/project 1/screenshot.png"
image_read(screenshot_path)

My meme

The key components are thrice:

I used an improved bell curve with performance-graded annotations to reinforce the central idea of my meme; used characters that are students of varying emotion, making the meme applicable to those reading it; and changed the text to an interesting observation that I made which was suitable for the format. In my gif I used an animated arrow to humorously suggest that those in the middle should get more stupid for a better result as getting more intellegent on a large scale simply is not practical - this phenomena is the heart and soul of the meme format.

#create the bell curve which the other images will append to
meme_template <- image_read(path = "C:/Users/muthu/OneDrive/Documents/stats 220/project 1/meme_template.png")


#create the project methods
set_due_date <- image_blank(color = "white", width = 300, height = 30) %>%
  image_annotate(text = "Using the due dates set by lecturers", size = 15, gravity = "center")

own_due_date <- image_blank(color = "white", width = 300, height = 30) %>%
  image_annotate(text = "Creating your own due dates", size = 15, gravity = "center")


#create the student images
poor_student <- image_read(path = "https://www.readandspell.com/sites/default/files/TypingCanHelpToAlleviateFrustration.jpeg") %>%
  image_scale("300")

average_student <- image_read("https://wpvip.edutopia.org/wp-content/uploads/2022/10/shutterstock_1958383675-crop.jpg?w=2880&quality=85") %>%
  image_scale("300")

high_student <- image_read(path = "https://thumbs.dreamstime.com/z/child-genius-education-holding-piece-chalk-e-mc-mortar-board-drawing-blackboard-concept-student-university-43081017.jpg?ct=jpeg") %>%
  image_scale("300")


#create image-text vectors
poor_performers_vector <- c(own_due_date, poor_student)

average_performers_vector <- c(set_due_date, average_student)

high_performers_vector <- c(own_due_date, high_student)


#create and format image-text objects
poor_performers_stack <- image_append(poor_performers_vector, stack = TRUE) %>%
  image_extent("200x250", color = "white") %>%
  image_rotate(324)

average_performers_stack <- image_append(average_performers_vector, stack = TRUE) %>%
  image_extent("400x250", color = "white")

high_performers_stack <- image_append(high_performers_vector, stack = TRUE) %>%
  image_extent("200x250", color = "white") %>%
  image_rotate(36)


#create stack vector
initial_stack <- c(average_performers_stack, meme_template)

#append stack vertically
bell_with_average <- image_append(initial_stack, stack = TRUE)


#create stack vector
final_stack <- c(poor_performers_stack, bell_with_average, high_performers_stack)

#append stack horizontally
final_meme <- image_append(final_stack)


# save meme as a file
final_meme %>%
  image_write("final_meme.png")

final_meme

#create arrow
arrow <- image_read("https://t3.ftcdn.net/jpg/03/25/85/98/360_F_325859887_bFw2wZLnyKLuePyLpmPdunztcg8Jl89C.jpg") %>%
  image_scale("140") %>%
  image_crop("135x90") %>%
  image_flip() %>%
  image_rotate(45) %>%
  image_flop()

#scale individual arrows
arrow_1 <- image_scale(arrow, "116")
arrow_2 <- image_scale(arrow, "117")
arrow_3 <- image_scale(arrow, "118")
arrow_4 <- image_scale(arrow, "119")
arrow_5 <- image_scale(arrow, "120")
arrow_6 <- image_scale(arrow, "121")
arrow_7 <- image_scale(arrow, "122")
arrow_8 <- image_scale(arrow, "123")
arrow_9 <- image_scale(arrow, "124")
arrow_10 <- image_scale(arrow, "125")
arrow_11 <- image_scale(arrow, "126")
arrow_12 <- image_scale(arrow, "127")
arrow_13 <- image_scale(arrow, "128")
arrow_14 <- image_scale(arrow, "129")
arrow_15 <- image_scale(arrow, "130")
arrow_16 <- image_scale(arrow, "131")
arrow_17 <- image_scale(arrow, "132")
arrow_18 <- image_scale(arrow, "133")
arrow_19 <- image_scale(arrow, "134")
arrow_20 <- image_scale(arrow, "135")
arrow_21 <- image_scale(arrow, "136")
arrow_22 <- image_scale(arrow, "137")
arrow_23 <- image_scale(arrow, "138")
arrow_24 <- image_scale(arrow, "139")


#create shrugging teacher
import_teacher <- image_read("https://as2.ftcdn.net/v2/jpg/02/95/53/89/1000_F_295538984_Ek8utytFd6V0XrM9DSxEoWBHFfrXVrSa.jpg")
teacher <- image_scale(import_teacher, "200") %>%
  image_annotate(text = "Down there bozo!", size = 24, gravity = "north", color = "white", font = "Impact")

#add teacher to meme
teacher_meme <- image_composite(final_meme, teacher, offset = "+60+20")


#create frames by adding individual arrows to meme
frame <- image_composite(teacher_meme, arrow, offset = "+262+110")
frame_1 <-  image_composite(teacher_meme, arrow_1, offset = "+262+110")
frame_2 <-  image_composite(teacher_meme, arrow_2, offset = "+262+110")
frame_3 <-  image_composite(teacher_meme, arrow_3, offset = "+262+110")
frame_4 <-  image_composite(teacher_meme, arrow_4, offset = "+262+110")
frame_5 <-  image_composite(teacher_meme, arrow_5, offset = "+262+110")
frame_6 <-  image_composite(teacher_meme, arrow_6, offset = "+262+110")
frame_7 <-  image_composite(teacher_meme, arrow_7, offset = "+262+110")
frame_8 <-  image_composite(teacher_meme, arrow_8, offset = "+262+110")
frame_9 <-  image_composite(teacher_meme, arrow_9, offset = "+262+110")
frame_10 <-  image_composite(teacher_meme, arrow_10, offset = "+262+110")
frame_11 <-  image_composite(teacher_meme, arrow_11, offset = "+262+110")
frame_12 <-  image_composite(teacher_meme, arrow_12, offset = "+262+110")
frame_13 <-  image_composite(teacher_meme, arrow_13, offset = "+262+110")
frame_14 <-  image_composite(teacher_meme, arrow_14, offset = "+262+110")
frame_15 <-  image_composite(teacher_meme, arrow_15, offset = "+262+110")
frame_16 <-  image_composite(teacher_meme, arrow_16, offset = "+262+110")
frame_17 <-  image_composite(teacher_meme, arrow_17, offset = "+262+110")
frame_18 <-  image_composite(teacher_meme, arrow_18, offset = "+262+110")
frame_19 <-  image_composite(teacher_meme, arrow_19, offset = "+262+110")
frame_20 <-  image_composite(teacher_meme, arrow_20, offset = "+262+110")
frame_21 <-  image_composite(teacher_meme, arrow_21, offset = "+262+110")
frame_22 <-  image_composite(teacher_meme, arrow_22, offset = "+262+110")
frame_23 <-  image_composite(teacher_meme, arrow_23, offset = "+262+110")
frame_24 <-  image_composite(teacher_meme, arrow_24, offset = "+262+110")

#create a vector of frames
animation_vector = c(frame_1, frame_2, frame_3, frame_4, frame_5, frame_6, frame_7, frame_8, frame_9, frame_10, frame_11, frame_12, frame_13, frame_14, frame_15, frame_16, frame_17, frame_18, frame_19, frame_20, frame_21, frame_22, frame_23, frame_24)

#animate this vector
my_animation <- image_animate(animation_vector, fps = 20) %>%
  image_write("my_animation.gif")

Creativity

My intention for this project was to stay true to the humorous elements in my meme. Instead of animating my entire image, which was not practical for my meme format, I encountered the unique challenges involved with an animated overlayed on a stationary image (see learning reflection). I used functions such as image_rotate(), image_flip(), image_flop() and image_crop() to create my animation. The most creative (and most fun!) section of my project was the Cascading Style Sheets programming. I played around with everything to increase the scope of my skills rather than a boring (but more formal) look. None of this code was taught in class.

Learning reflection

I initially created an independent arrow animation and then used image_composite() to overlay the animation to the background meme using offset. This ensured that the arrow scaled from top right to bottom left. However this resulted in technical difficulties as my animation showed a preview of frames in the viewer but did not knit. I learnt that while using the magick package I should combine all of my individual images into frames and then animate through the frames. Although the arrow now scales from top left to bottom right, which looks worse for a bottom-left facing arrow, I am still happy with the result.

I learned how alignments worked which was not intuitive to me. Furthermore, I learned how to utilize piping and assignments in the R language which I have not encountered before and proved to be really useful since most of my functions we applying to themselves multiple times and hence these tools heavily improved the readability of my code.

I am interested in custom animation technologies especially involving the scaling of images from custom points rather than top left and bottom right since this was relevant to my assignment.